#ifndef CONSTANTIMPORT_H
#define CONSTANTIMPORT_H

#include "constantdefinition.h"

#include <QObject>
#include <QFile>

class QDomNode;
class QDomElement;
class QDomDocument;

class ConstantImport : public QObject
{
    Q_OBJECT
public:
    explicit ConstantImport(QObject *parent = nullptr);

    /**
     * @brief readConstantFile      读取文件
     * @param filePath              文件路径
     * @param datas                 常量数据
     * @return
     */
    bool readConstantFile(const QDomNode &root);

    void dataProcess(QFile &file,QStringList &deleteTypes,ConstantDefine::ConstantList &datas);

    /**
     * @brief saveConstantFile      保存数据
     * @param filePath              文件路径
     * @param datas                 常量数据
     * @return
     */
    bool saveConstantFile(const QString &filePath, const ConstantDefine::ConstantList &datas);

    bool constantImport(const QString & filePath,const QDomNode &node);

    static void clearConstantMap();

private:

    void constListProcess(QDomNode &constNode,QDomDocument &doc);

    /**
     * @brief parseConstants        解析常量
     * @param element               QDom元素
     */
    void parseConstants(ConstantDefine::Constant &constant,const QDomElement &element);

    /**
     * @brief parseNormalData        解析共有数据
     * @param typeElement            类型元素
     * @param valueElement           值元素
     * @param constantName           常量名称
     * @param oid                    oid
     * @param comment                描述
     */
    void parseNormalData(ConstantDefine::Constant &data,const QDomElement &typeElement, const QDomElement &valueElement, const QString &constantName
                         , const QString &oid, const QString &comment);

    /**
     * @brief parseConstValue       解析常量值
     * @param constValueElement     值元素
     * @param data                  常量数据
     */
    void parseConstValue(QDomElement &constValueElement, ConstantDefine::Constant &data);

    /**
     * @brief parseDataStructOp     解析结构体
     * @param dataStructOpElement   结构体元素
     * @param data                  常量数据
     */
    void parseDataStructOp(const QDomElement &dataStructOpElement, ConstantDefine::Constant &data);

    /**
     * @brief parseDataArrayOp      解析数组
     * @param dataArrayOpElement    数组元素
     * @param data                  常量数据
     */
    void parseDataArrayOp(const QDomElement &dataArrayOpElement, ConstantDefine::Constant &data);

    /**
     * @brief parseDataStructOp     解析结构体
     * @param dataStructOpElement   结构体元素
     * @param datas                 结构体列表
     */
    void parseDataStructOp(const QDomElement &dataStructOpElement, ConstantDefine::StructEleList &datas);

    /**
     * @brief parseConstValue       解析结构体值
     * @param flowChildElement      单个值元素
     * @param data                  结构体元素数据
     */
    void parseConstValue(const QDomElement &flowChildElement, ConstantDefine::StructEle &data);

    /**
     * @brief parseDataStruct       解析结构体
     * @param flowChildElement      结构体单个元素
     * @param data                  结构体元素
     */
    void parseDataStruct(const QDomElement &flowChildElement, ConstantDefine::StructEle &data);

    /**
     * @brief parseConstValue       解析数组元素
     * @param valueElement          值元素
     * @param data                  数组数据
     */
    void parseConstValue(QDomElement &valueElement, ConstantDefine::DimensionArray &data);

    /**
     * @brief parseDataArray        解析数组
     * @param valueElement          数组值元素
     * @param data                  数组数据
     */
    void parseDataArray(const QDomElement &valueElement, ConstantDefine::DimensionArray &data);


    /**
     * @brief saveConstants         保存常量
     * @param element               xml元素
     * @param data                  常量数据
     * @param doc                   doc对象
     */
    void saveConstants(QDomElement &element, const ConstantDefine::Constant &data, QDomDocument &doc);

    /**
     * @brief saveNormalData        保存共有数据
     * @param element               xml元素
     * @param data                  常量数据
     * @param doc                   doc对象
     */
    void saveNormalData(QDomElement &element, const ConstantDefine::Constant &data, QDomDocument &doc);

    /**
     * @brief saveValueData         保存元素数据
     * @param element               xml元素
     * @param data                  常量数据
     * @param doc                   doc对象
     */
    void saveValueData(QDomElement &element, const ConstantDefine::Constant &data, QDomDocument &doc);

    /**
     * @brief saveConstValue        保存元素值
     * @param element               xml元素
     * @param data                  元素值
     * @param doc                   doc对象
     */
    void saveConstValue(QDomElement &element, const QString &data, QDomDocument &doc);

    /**
     * @brief saveDataStruct        保存结构体
     * @param element               xml元素
     * @param datas                 结构体列表
     * @param doc                   doc对象
     */
    void saveDataStruct(QDomElement &element, const ConstantDefine::StructEleList &datas, QDomDocument &doc);

    /**
     * @brief saveDataStructEle     结构体元素
     * @param element               xml元素
     * @param data                  结构体元素
     * @param doc                   doc对象
     */
    void saveDataStructEle(QDomElement &element, const ConstantDefine::StructEle &data, QDomDocument &doc);

    /**
     * @brief saveDataArray         保存数组
     * @param element               xml元素
     * @param data                  数组元素
     * @param doc                   doc对象
     */
    void saveDataArray(QDomElement &element, const ConstantDefine::DimensionArray &data, QDomDocument &doc);

    /**
     * @brief getOid                获取id
     * @param idNode                id节点
     * @return
     */
    QString getOid(const QDomNode &idNode);

    /**
     * @brief getComment            获取描述
     * @param paragmasNode          描述节点
     * @return
     */
    QString getComment(const QDomNode &paragmasNode);

    /**
     * @brief jugementBaseType      判断基础类型
     * @param value                 数据值
     * @return
     */


    void typeConvert(const QHash<QString,QString> &hash, ConstantDefine::Constant &data);

    void oidConvert(ConstantDefine::Constant &data);

    bool removeXmlComments(const QString& filePath);

    void removeCommentsRecursive(QDomNode& node);
public:
    // 常量数据
    ConstantDefine::ConstantList m_datas;
    QHash<QString,QString> hash;
    QHash<QString,QString> suffix;

};

#endif // CONSTANTIMPORT_H
